//===== 创建对象

//javascript在最开始设计时就只是做一个简单的脚本语言，
//没有想着把它作为一门独立的语言，只是在页面完成一些效果
//所以完成小功能时就只需要let obj={};
//不需要像java一样通过类去创建object

// 当然也不排除javascript需要使用很多对象，所以javascript的创建者为了
// 方便简单，创建对象时使用原型克隆的方式创建

// 1.Object.create()
// let person=new Object()
// let person = {
//     name: 'zhangsan',
//     age: 30,
//     // show: function () {
//     //     console.log('show');
//     // },
//     teacher:{
//         name:'xiaohu'
//     },

//     show() {
//         console.log('show');
//     }
// }

// let user2 = Object.create(person);
// console.log(user2.name, user2.age);
// user2.show()
// console.log(person == user2);//false 地址指向不同，互不影响

// user2.name='lisi';
// console.log(user2.name);
// console.log(person.name);
//如果里层还嵌套了一个对像，里层对象的地址直接被克隆过来
// user2.teacher.name='laowang'
// console.log(user2.teacher.name);//laowang
// console.log(person.teacher.name);//laowang

//user2是通过Object.create(person)克隆来的，这种方式就是通过原型创建
//所以user2的隐式原型就是person
// 1.每一个对象都有自己的原型对象__proto__
// console.log(user2.__proto__);//person
// console.log(person.__proto__);//new Object();
// 2.每一个构造函数都有一个prototype的属性，指向实例出来的对象的原型
// console.log(person.__proto__==Object.prototype);//true


let user = {
    username: 'zhangsan',
    age: 22
}

console.log(user.__proto__);
let user1 = Object.create(user);
console.log(user1.__proto__);
console.log(Object.prototype == user.__proto__);
//3.通过__proto__一层一层往上找原型对象，最终会找到null
console.log(Object.prototype.__proto__);

//2.自定义构造函数创建对象


function Computer(name, size, price) {
    //this指向实例化出来的对象
    this.name = name;
    this.size = size;
    this.price = price;
    // this.show = function () {
    //     console.log(this.name);
    // }
}
//所有的电脑都能够有show这个方法，所以没必要给每个对象身上
//都写上show方法，直接写在原型身上，对象就可以共享
// 类似的情况还有数组的方法
Computer.prototype.show = function () {
    console.log(this.name);
}

let apple = new Computer('mac', 13, 10000);
// console.log(apple);
let lenovo = new Computer('lenovo', 15, 8000);
// console.log(lenovo);

// apple.show()
// lenovo.show()
console.log(lenovo.__proto__);
console.log(apple.__proto__ == Computer.prototype);//true
console.log(Computer.prototype);
//4.构造函数的prototype中有一个constructor属性又指回构造函数本身
console.log(Computer.prototype.constructor);
console.log(Computer.prototype.constructor == Computer)//true

console.log(lenovo.__proto__ === Computer.prototype);
console.log(lenovo.__proto__ === apple.__proto__);


console.log(apple, lenovo);

apple.show();
lenovo.show();


let arr = [1, 2, 3];
console.log(Array);

//原型就是为了能够查找成员、追根溯源

// public class Student {
//     private String name;
//     private Int age;

//     public Student(String name, Int age) {
//         this.name = name;
//         this.age = age;
//     }
// }

// Student stu = new Student('zhangsan', 20);